package com.sakura.system.controller.yzccontroller;

//import com.rabbiter.cm.common.exception.DataNotFoundException;
//import com.rabbiter.cm.common.response.ResponseResult;
//import com.rabbiter.cm.common.utils.ApplicationContextUtils;
//import com.rabbiter.cm.domain.SysBill;
//import com.rabbiter.cm.domain.SysMovie;
//import com.rabbiter.cm.domain.SysSession;
//import com.rabbiter.cm.domain.vo.SysBillVo;
//import com.rabbiter.cm.service.impl.SysBillServiceImpl;
//import com.rabbiter.cm.service.impl.SysMovieServiceImpl;
//import com.rabbiter.cm.service.impl.SysSessionServiceImpl;
import com.sakura.system.coommon.DataNotFoundException;
import com.sakura.system.coommon.response.ResponseResult;
import com.sakura.system.entity.yzc.SysBill;
import com.sakura.system.entity.yzc.SysBillVo;
import com.sakura.system.entity.yzc.SysMovie;
import com.sakura.system.entity.yzc.SysSession;
import com.sakura.system.service.impl.yzcimpl.SysBillServiceImpl;
import com.sakura.system.service.impl.yzcimpl.SysMovieServiceImpl;
import com.sakura.system.service.impl.yzcimpl.SysSessionServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@RestController
@RequestMapping("${app.router.url}")
public class SysBillController extends BaseController {

    @Autowired
    private SysBillServiceImpl sysBillService;

    @Autowired
    private SysSessionServiceImpl sysSessionService;

    @Autowired
    private SysMovieServiceImpl sysMovieService;

    /**
     * 查询所有账单信息
     *
     * @param sysBill 分页及查询条件对象
     * @return 返回账单信息的响应结果
     */
    @GetMapping("/sysBill")
    public ResponseResult findAllBills(SysBill sysBill) {
        startPage(); // 初始化分页信息

        // 取消所有超时订单并释放占座资源
//        ApplicationContextUtils.getBean("cancelTimeoutBill");

        List<SysBill> data = sysBillService.findAllBills(sysBill); // 查询符合条件的账单信息
        return getResult(data); // 构建并返回响应结果
    }

    /**
     * 根据账单ID查询账单信息
     *
     * @param id 账单的唯一标识符，从URL路径变量中获取
     * @return 返回一个响应结果，包含查询到的账单信息
     */
    @GetMapping("/sysBill/{id}")
    public ResponseResult findBillById(@PathVariable Long id) {
        // 通过账单服务根据ID查询账单，然后封装成响应结果返回
        return getResult(sysBillService.findBillById(id));
    }

    /**
     * 添加场次订单
     *
     * @param sysBillVo 场次订单的视图对象，包含场次和订单的详细信息
     * @return 返回操作结果，如果操作涉及到错误，会返回相应的错误信息
     */
    @PostMapping("/sysBill")
    public ResponseResult addBill(@Validated @RequestBody SysBillVo sysBillVo) {
        // 根据场次ID查找当前场次信息
        SysSession curSession = sysSessionService.findOneSession(sysBillVo.getSysBill().getSessionId());
        if (curSession == null) {
            throw new DataNotFoundException("添加订单的场次没找到");
        }
        // 更新当前场次的座位信息
        curSession.setSessionSeats(sysBillVo.getSessionSeats());

        // 计算本次添加的座位数量
        int addSallNums = sysBillVo.getSysBill().getSeats().split(",").length;
        // 更新场次的总座位数量
        curSession.setSallNums(curSession.getSallNums() + addSallNums);
        // 保存更新后的场次信息
        sysSessionService.updateSession(curSession);

        // 添加场次订单
        Object obj = sysBillService.addBill(sysBillVo.getSysBill());
        // 根据返回类型生成相应的操作结果
        if (obj instanceof Integer) {
            return getResult((Integer) obj);
        }
        return getResult(obj);
    }

    /**
     * 处理支付请求。
     *
     * @param sysBill 包含支付信息的系统账单对象，通过RequestBody接收前端传来的JSON数据。
     * @return 返回操作结果，包括操作行数等信息。
     */
    @PutMapping("/sysBill")
    public ResponseResult pay(@RequestBody SysBill sysBill) {
        // 更新账单信息
        int rows = sysBillService.updateBill(sysBill);
        if (rows > 0 && sysBill.getPayState()) {
            // 如果支付状态为成功，则进行后续处理
            // 尝试根据会话ID查找对应的场次信息
            SysSession curSession = sysSessionService.findOneSession(sysBill.getSessionId());
            if (curSession == null) {
                // 如果找不到场次，抛出异常
                throw new DataNotFoundException("支付订单的场次没找到");
            }
            // 根据场次ID查找对应的电影信息
            SysMovie curMovie = sysMovieService.findOneMovie(curSession.getMovieId());
            if (curMovie == null) {
                // 如果找不到电影，抛出异常
                throw new DataNotFoundException("支付订单的电影没找到");
            }
            // 计算订单座位数和更新电影票房
            int seatNum = sysBill.getSeats().split(",").length; // 订单座位数
            double price = curSession.getSessionPrice(); // 场次价格
            curMovie.setMovieBoxOffice(curMovie.getMovieBoxOffice() + seatNum * price); // 更新电影票房
            sysMovieService.updateMovie(curMovie); // 更新电影信息
        }
        // 返回操作结果
        return getResult(rows);
    }

    /**
     * 取消订单，并更新相关座位状态。
     *
     * @param sysBillVo 包含订单信息和要取消的座位信息的对象
     * @return 返回操作结果，包括操作影响的行数
     */
    @PutMapping("/sysBill/cancel")
    public ResponseResult cancel(@RequestBody SysBillVo sysBillVo) {
        // 更新订单状态为取消
        int rows = sysBillService.updateBill(sysBillVo.getSysBill());
        if (rows > 0 && sysBillVo.getSysBill().getCancelState()) {
            // 如果订单成功取消且状态为取消，则更新场次的座位状态
            SysSession curSession = sysSessionService.findOneSession(sysBillVo.getSysBill().getSessionId());
            // 计算取消的座位数量
            int cancelSallNums = sysBillVo.getSysBill().getSeats().split(",").length;
            curSession.setSallNums(curSession.getSallNums() - cancelSallNums);
            // 如果无法找到对应的场次信息，则抛出异常
            if (curSession == null) {
                throw new DataNotFoundException("添加订单的场次没找到");
            }
            // 更新场次的座位状态
            curSession.setSessionSeats(sysBillVo.getSessionSeats());
            sysSessionService.updateSession(curSession);
        }
        // 返回操作结果
        return getResult(rows);
    }

    /**
     * 删除账单
     *
     * @param ids 要删除的账单ID数组，通过路径变量传递
     * @return 返回操作结果，封装在ResponseResult对象中
     */
    @DeleteMapping("/sysBill/{ids}")
    public ResponseResult deleteBill(@PathVariable Long[] ids) {
        // 调用服务层方法，删除指定ID的账单，返回操作结果
        return getResult(sysBillService.deleteBill(ids));
    }

}
